# -*- coding: utf-8 -*-
"""
------------------------------------------------------------------------------
    File Name:  sorted_samp
    Author   :  wanwei1029
    Date     :  2018/3/5
    Desc     :
    python的排序函数有sorted()和sort,其中sort只对list有效，sorted()对所有可迭代对象有效，返回一个list对象。
    sort是在原位重新排列列表，而sorted()是产生一个新的列表。
    sorted()函数原型为：sorted(iterable，cmp，key，reverse）
    注意：python3取消了sorted函数的cmp参数，有替代方案（functools.cmp_to_key），另外，sorted要求迭代的对象必须是可比较的，可用key指定比较
    如果是一个二维数组，可以通过key lambda来确定用哪列进行排序。
    key还可以在比较前对元素进行处理，比如大小写等。
    对于map里元素进行排序，需要结合operator来进行
    argsort，返回的是数值从小到大的索引，并不是元素。

------------------------------------------------------------------------------
"""
import sys
import operator
import numpy as np

sys.path.append("..")
import samp_logging as sl

logger = sl.get_logger('sorted_samp')


def base_sorted():
    list_a = [1, 2, 4, 3, 64, 2, 0]
    logger.info("list result is {0}".format(sorted(list_a)))
    list_b = [["a",32], ["c",2], ["b",43], ["g",9]]
    logger.info("2d list sorted is {0}".format(sorted(list_b, key=lambda x:x[0])))
    logger.info("2d list sorted is {0}".format(sorted(list_b, key=lambda x: x[1])))
    logger.info("2d list sorted is {0}".format(sorted(list_b, key=lambda x: str(x[1]))))
#    注意，这样list和dict混合比较不了，也没意义 list_c = [{"a": "32"}, {"c": "2"}, {"b": "43"}, {"g": "9"}]
#    还有，没有二维的map,这样定义是错的。{{"a": "32"}, {"c": "2"}, {"b": "43"}, {"g": "9"}}，报错：TypeError: unhashable type: 'dict'
    list_c = {"a": "32", "c": "2", "b": "43", "g": "9"}
    print(list_c.items())
    logger.info("map list sorted is {0}".format(sorted(list_c.items(), key=operator.itemgetter(0))))
    logger.info("map list sorted is {0}".format(sorted(list_c.items(), key=operator.itemgetter(1))))


def argsort_samp():
    array_a = np.array([1,3,2,4,1,2])
    logger.info("array_a result is {0}".format(np.argsort(array_a)))
#   按降序排列
    logger.info("array_a result is {0}".format(np.argsort(-array_a)))


if __name__ == '__main__':
    test_method = "argsort_samp"
    if test_method == "base_sorted":
        base_sorted()
    elif test_method == "argsort_samp":
        argsort_samp()
